문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 인라인 함수 (문단 편집) == 인라이닝의 문법적 의의 == 인라이닝에는 문법적인 의의도 있는데, 바로 ODR (One Definition Rule)을 무시한다는 것이다. 보통 같은 이름의 심볼이 서로 다른 translation unit에 존재하면 링커가 심볼 중복 문제로 인해 에러를 띄우는 반면, 인라인 함수는 여러 파일에 중복 정의가 되든 말든 ODR을 만족한 것으로 간주되어 정상적으로 링크된다. 또한 인라인 함수를 포인터로 취급하거나 인라인 함수 내 static 로컬 변수가 있다든지, const literal이 있다든지 등의 이유로 인라인 함수 본체가 바이너리에 들어가야 하는 상황이 와도, 최종 바이너리에는 정확히 한 카피만 들어가게 된다. 이 점이 유용한 것은 헤더에 함수 정의가 들어가 있는 경우인데, 함수 정의가 들어간 헤더를 여러 translation unit에서 동시에 include할 경우 각 translation unit마다 함수 심볼과 정의가 중복된다. 따라서 보통은 위에서 언급한 대로 링커 에러가 나야 하지만, 인라이닝을 수행하면 그런 문제 없이 정의를 할 수 있다. C++에서는 클래스 정의 내부에 들어있는 함수 구현의 경우는 자동으로 인라인 취급된다. 보통 단순 getter 및 setter 등의 내용물은 이런 식으로 구현된다. virtual 함수도 inline을 할 수 있는데, 컴파일러 입장에서 실제 바인딩될 함수가 뭔지 모르므로 인라이닝이 불가능하여 보통은 쓸모 없다. 다만 드물게 컴파일러가 바인딩될 함수를 미리 알아챌 수 있는 경우에 한정해 인라이닝이 가능하다. * 포인터/레퍼런스가 아닌 concrete object를 가지고 직접 콜할 경우 * (C++11) 포인터/레퍼런스 타입 상에서 virtual inline 함수가 final이거나, 혹은 포인터/레퍼런스 타입 자체가 final인 경우. 물론 ODR을 무시한다고 해서 제멋대로 선언 가능한 것은 아니다. 인라인 함수가 한 translation unit 안에 여러번 중복되어 정의되면 컴파일 에러가 일어나고, 서로 다른 translation unit 간에 이름만 같고 내용물이 다르게 정의될 경우 잘해봐야 링커 에러, 최악의 경우 UB 크리를 먹으므로 주의할 것. 함수 본체 내 매크로를 심하게 사용할 경우 간혹 일어날 수 있는 현상이다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기